//: generics/InheritBounds.java
package generics;

class HoldItem<T>
{
    T item;
    
    HoldItem(T item)
    {
        this.item = item;
    }
    
    T getItem()
    {
        return item;
    }
}

class Colored2<T extends HasColor> extends HoldItem<T>
{
    Colored2(T item)
    {
        super(item);
    }
    
    java.awt.Color color()
    {
        return item.getColor();
    }
}

class ColoredDimension2<T extends Dimension & HasColor> extends Colored2<T>
{
    ColoredDimension2(T item)
    {
        super(item);
    }
    
    int getX()
    {
        return item.x;
    }
    
    int getY()
    {
        return item.y;
    }
    
    int getZ()
    {
        return item.z;
    }
}

class Solid2<T extends Dimension & HasColor & Weight> extends ColoredDimension2<T>
{
    Solid2(T item)
    {
        super(item);
    }
    
    int weight()
    {
        return item.weight();
    }
}

public class InheritBounds
{
    public static void main(String[] args)
    {
        Solid2<Bounded> solid2 = new Solid2<Bounded>(new Bounded());
        solid2.color();
        solid2.getY();
        solid2.weight();
    }
} /// :~
